看了几篇文章,因为文章很新手向,所以内容很繁琐。故整理一下重点,写了测试程序去了解几个知识点,不讨论基本概念。
非集合类对象的copy与mutableCopy
//NSString & NSMutableString
NSString *strA = @"origin";
NSLog(@"strA pointer: %p content: %@", strA, strA);
NSString *strACopy = [strA copy];
NSLog(@"strCopy pointer: %p content: %@", strACopy, strACopy);
NSMutableString *strAMCopy = [strA mutableCopy];
NSLog(@"strMCopy pointer: %p content: %@", strAMCopy, strAMCopy);
NSMutableString *strB = [NSMutableString stringWithString:@"mutable string"];
NSLog(@"strB pointer: %p content: %@", strB, strB);
NSMutableString *strBCopy = [strB copy];
NSLog(@"strBCopy pointer: %p content: %@", strBCopy, strBCopy);
NSMutableString *strBMCopy = [strB mutableCopy];
NSLog(@"strBMCopy pointer: %p content: %@", strBMCopy, strBMCopy);
//输出
strA pointer: 0x100003180 content: origin
strCopy pointer: 0x100003180 content: origin
strMCopy pointer: 0x100102e90 content: origin
strB pointer: 0x100700510 content: mutable string
strBCopy pointer: 0x100700570 content: mutable string
strBMCopy pointer: 0x1006002c0 content: mutable string
在非集合类对象中:对immutable
对象进行copy
操作,是指针复制,mutableCopy
操作时内容复制;对mutable
对象进行copy
和mutableCopy
都是内容复制。
结论
- [immutableObject copy] // 浅复制
- [immutableObject mutableCopy] //深复制
- [mutableObject copy] //深复制
- [mutableObject mutableCopy] //深复制
集合类对象的copy与mutableCopy
NSArray *arrayA = @[@[@"A", @"B"], @[@"C", @"D"]];
NSLog(@"arrayA pointer:%p contentA:%p contentB:%p", arrayA, arrayA[0], arrayA[1]);
NSArray *arrCopyA = [arrayA copy];
NSLog(@"arrCopyA pointer:%p contentA:%p contentB:%p", arrCopyA, arrCopyA[0], arrCopyA[1]);
NSMutableArray *arrMCopyA = [arrayA mutableCopy];
NSLog(@"arrMCopyA pointer:%p contentA:%p contentB:%p", arrMCopyA,arrMCopyA[0], arrMCopyA[1]);
NSMutableArray *arrayB = [NSMutableArray arrayWithObjects:@[@"A", @"B"], @[@"C", @"D"], nil];
NSLog(@"arrayB pointer:%p contentA:%p contentB:%p", arrayB, arrayB[0], arrayB[1]);
NSArray *arrCopyB = [arrayB copy];
NSLog(@"arrCopyB pointer:%p contentA:%p contentB:%p", arrCopyB, arrCopyB[0], arrCopyB[1]);
NSMutableArray *arrMCopyB = [arrayB mutableCopy];
NSLog(@"arrMCopyB pointer:%p contentA:%p contentB:%p", arrMCopyB,arrMCopyB[0], arrMCopyB[1]);
//输出
arrayA pointer:0x100700860 contentA:0x100700840 contentB:0x1007007c0
arrCopyA pointer:0x100700860 contentA:0x100700840 contentB:0x1007007c0
arrMCopyA pointer:0x100700990 contentA:0x100700840 contentB:0x1007007c0
arrayB pointer:0x100701970 contentA:0x100700880 contentB:0x100701730
arrCopyB pointer:0x100102080 contentA:0x100700880 contentB:0x100701730
arrMCopyB pointer:0x100701ab0 contentA:0x100700880 contentB:0x100701730
可以看到拷贝过程和非集合类大体相同。注意一点,就是拷贝过程只是针对对象本身,而对象内部的元素还是指针复制,从上面打印的输出就可以看出来。
示例
看如下代码,有一个mutable
数组,赋值给immutable
数组
@property (nonatomic, copy) NSArray *array;
NSMutableArray *mArray = [NSMutableArray array];
[mArray addObject:@"AA"];
_array = mArray;
NSLog(@"mArray: %p, _array: %p", mArray, _array);
[mArray addObject:@"BB"];
NSLog(@"mArray = %@, _array = %@", mArray, _array);
其中,直接对array
属性赋值,这样,_array
和mArray
便是指向同一对象的指针,因为NSMutableArray
是NSArray
的子类,故_array
能够接受mArray
的值。
应该说是 _array
是一个指针,通过 _array = mArray
使两个指针指向同一个地方。
输出结果:
mArray: 0x126ec3e00, _array: 0x126ec3e00
mArray = (
AA,
BB
), _array = (
AA,
BB
)
下面做个修改,把
_array = mArray;
改为
_array = [mArray copy];
想想结果如何?
mArray
是mutable
对象,拷贝属于(不完全)深拷贝,所以可以想到_array
的指针和mArray
并不相同,所以后面mArray
改变内容也与_array
无关。
输出:
mArray: 0x154dc8070, _array: 0x154dcf4e0
mArray = (
AA,
BB
), _array = (
AA
)
Reference
小结 iOS 中的 copy
iOS 集合的深复制与浅复制